package;

import haxe.Utf8;
import flixel.FlxG;
import flixel.FlxSprite;
import flixel.FlxState;
import flixel.system.FlxSound;
import flixel.text.FlxText;
import flixel.ui.FlxButton;
import flixel.util.FlxMath;
import flixel.util.FlxColor;
import flixel.addons.text.FlxTypeText;
import flixel.tweens.FlxTween;
import flixel.tweens.FlxEase;
import flixel.util.FlxRandom;
import sys.db.Connection;
import sys.db.SqLite;
import flixel.input.gamepad.FlxGamepad;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
import openfl.Assets;

/**
 * A FlxState which can be used for the game's menu.
 */
class PreguntaState extends FlxState
{
	/**
	 * Function that is called up when to state is created to set it up. 
	 */
	
	private var _bg:FlxSprite;
	private var _pregunta:FlxTypeText;
	private var _relojTexto:FlxText;
	private var _reloj:Float;
	private var _imagen:FlxSprite;
	private var _respuesta1:FlxText;
	private var _respuesta2:FlxText;
	private var _respuesta3:FlxText;
	private var _respuesta4:FlxText;
	private var _imagenRespuesta1:FlxSprite;
	private var _imagenRespuesta2:FlxSprite;
	private var _imagenRespuesta3:FlxSprite;
	private var _imagenRespuesta4:FlxSprite;
	private var player1:PlayerInput;
	private var player2:PlayerInput;
	private var player3:PlayerInput;
	private var player4:PlayerInput;
	private var estado:String;
	private var fadeTime:Float;
	private var resultBg:FlxSprite;
	private var result1:FlxText;
	private var result2:FlxText;
	private var result3:FlxText;
	private var result4:FlxText;
	private var scoreTime:Float;
	private var score1:Int;
	private var score2:Int;
	private var score3:Int;
	private var score4:Int;
	private var answer:Int;
	private var score:Int;
	private var pregLength:Float;
	private var sound:Sound;
	private var channel:SoundChannel;
	private var imagenReloj:FlxSprite;
	private var modoText:FlxText;
	private var opcionAzul:FlxSprite;
	private var opcionRojo:FlxSprite;
	private var opcionVerde:FlxSprite;
	private var opcionAmarillo:FlxSprite;
	private var textoAzul:FlxText;
	private var textoRojo:FlxText;
	private var textoVerde:FlxText;
	private var textoAmarillo:FlxText;
	private var time:Float;
	private var tilde1:FlxSprite;
	private var tilde2:FlxSprite;
	private var tilde3:FlxSprite;
	private var tilde4:FlxSprite;
	private var cruz1:FlxSprite;
	private var cruz2:FlxSprite;
	private var cruz3:FlxSprite;
	private var cruz4:FlxSprite;
	override public function create():Void
	{
		super.create();
		sound = Assets.getMusic ("assets/music/musica.ogg");
		channel = sound.play (0,0, new SoundTransform (1, 0));
		FlxG.camera.fade(FlxColor.BLACK, 1, true);
		_bg = new FlxSprite(0, 0);
		_bg.loadGraphic("assets/images/fondo2.jpg");
		_bg.color = FlxColor.GOLDENROD;
		add(_bg);
		
		
		imagenReloj = new FlxSprite(0, 0);
		imagenReloj.loadGraphic("assets/images/reloj.png");
		imagenReloj.x = FlxG.width - imagenReloj.width;
		add(imagenReloj);
		
		_reloj = 30;
		_relojTexto = new FlxText(800 - imagenReloj.width, 20, imagenReloj.width, Std.string(Std.int(_reloj)));
		_relojTexto.setFormat(null, 45, FlxColor.BLACK, "center");
		_relojTexto.font = "font";
		add(_relojTexto);
		
		modoText = new FlxText(0, 10, 800, Reg.modo, 50);
		modoText.setFormat("font", 50,FlxColor.BLACK,"center");
		add(modoText);
		
		_pregunta = new FlxTypeText(20, 100, 760, "Que pais tiene como capital Cordoba?");
		_pregunta.setFormat(null, 40, FlxColor.BLACK, "left");
		_pregunta.font = "font";
		_pregunta.setCompleteCallback(mostrarRespuestas);
		add(_pregunta);
		
		_imagenRespuesta1 = new FlxSprite(FlxG.width/2 - 250/2,360);
		_imagenRespuesta1.loadGraphic("assets/images/boton.png");
		//_imagenRespuesta1.makeGraphic(155, 80, FlxColor.BLACK);
		add(_imagenRespuesta1);
		_imagenRespuesta2 = new FlxSprite(FlxG.width / 2 - 250 / 2 - 250, 410);
		_imagenRespuesta2.loadGraphic("assets/images/boton.png");
		add(_imagenRespuesta2);
		_imagenRespuesta3 = new FlxSprite(FlxG.width/2 - 250/2, 460);
		_imagenRespuesta3.loadGraphic("assets/images/boton.png");
		add(_imagenRespuesta3);
		_imagenRespuesta4 = new FlxSprite(FlxG.width/2 - 250/2 + 250, 410);
		_imagenRespuesta4.loadGraphic("assets/images/boton.png");
		add(_imagenRespuesta4);
		
		_respuesta1 = new FlxText(FlxG.width/2 - 250/2 + 10, 380, 230, "Argentina");
		_respuesta1.setFormat(null, 25, FlxColor.WHITE, "center",FlxText.BORDER_OUTLINE);
		_respuesta1.font = "font";
		//_respuesta1.visible = false;
		add(_respuesta1);
		_respuesta2 = new FlxText(FlxG.width/2 - 250/2 - 250 + 10, 430, 230, "España");
		_respuesta2.setFormat(null, 25, FlxColor.WHITE, "center",FlxText.BORDER_OUTLINE);
		_respuesta2.font = "font";
		//_respuesta2.visible = false;
		add(_respuesta2);
		_respuesta3 = new FlxText(FlxG.width/2 - 250/2 + 10, 480, 230, "Ninguno.");
		_respuesta3.setFormat(null, 25, FlxColor.WHITE, "center",FlxText.BORDER_OUTLINE);
		_respuesta3.font = "font";
		//_respuesta3.visible = false;
		add(_respuesta3);
		_respuesta4 = new FlxText(FlxG.width/2 - 250/2 + 250 + 10, 430, 230, "Uruguay");
		_respuesta4.setFormat(null, 25, FlxColor.WHITE, "center",FlxText.BORDER_OUTLINE);
		_respuesta4.font = "font";
		//_respuesta4.visible = false;
		add(_respuesta4);
		
		
		opcionAzul = new FlxSprite(0, 0);
		opcionAzul.loadGraphic("assets/images/opcionAzul.png");
		opcionAzul.x = 5;
		opcionAzul.y = _imagenRespuesta2.y - 5 - opcionAzul.height;
		add(opcionAzul);
		
		opcionRojo = new FlxSprite(0, 0);
		opcionRojo.loadGraphic("assets/images/opcionRojo.png");
		opcionRojo.x = 795 - opcionRojo.width;
		opcionRojo.y = _imagenRespuesta4.y - 5 - opcionRojo.height;
		add(opcionRojo);
		
		opcionVerde = new FlxSprite(0, 0);
		opcionVerde.loadGraphic("assets/images/opcionVerde.png");
		opcionVerde.x = 5;
		opcionVerde.y = _imagenRespuesta2.y + 5 + _imagenRespuesta2.height;
		add(opcionVerde);
		
		opcionAmarillo = new FlxSprite(0, 0);
		opcionAmarillo.loadGraphic("assets/images/opcionAmarillo.png");
		opcionAmarillo.x = 795 - opcionAmarillo.width;
		opcionAmarillo.y = _imagenRespuesta4.y + 5 + _imagenRespuesta4.height;
		add(opcionAmarillo);
		
		textoAzul = new FlxText(opcionAzul.x, opcionAzul.y + 5, opcionAzul.width, "");
		textoAzul.setFormat("font", 40, FlxColor.WHITE, "center", FlxText.BORDER_OUTLINE);
		add(textoAzul);
		
		textoRojo = new FlxText(opcionRojo.x, opcionRojo.y + 5, opcionRojo.width, "");
		textoRojo.setFormat("font", 40, FlxColor.WHITE, "center", FlxText.BORDER_OUTLINE);
		add(textoRojo);
		
		textoVerde = new FlxText(opcionVerde.x, opcionVerde.y + 5, opcionVerde.width, "");
		textoVerde.setFormat("font", 40, FlxColor.WHITE, "center", FlxText.BORDER_OUTLINE);
		add(textoVerde);
		
		textoAmarillo = new FlxText(opcionAmarillo.x, opcionAmarillo.y + 5, opcionAmarillo.width, "");
		textoAmarillo.setFormat("font", 40, FlxColor.WHITE, "center", FlxText.BORDER_OUTLINE);
		add(textoAmarillo);
		
		tilde1 = new FlxSprite(opcionAzul.x,opcionAzul.y);
		tilde1.loadGraphic("assets/images/tilde.png");
		tilde1.scale.set(0,0);
		add(tilde1);
		
		tilde2 = new FlxSprite(opcionRojo.x,opcionRojo.y);
		tilde2.loadGraphic("assets/images/tilde.png");
		tilde2.scale.set(0,0);
		add(tilde2);
		
		tilde3 = new FlxSprite(opcionVerde.x,opcionVerde.y);
		tilde3.loadGraphic("assets/images/tilde.png");
		tilde3.scale.set(0,0);
		add(tilde3);
		
		tilde4 = new FlxSprite(opcionAmarillo.x,opcionAmarillo.y);
		tilde4.loadGraphic("assets/images/tilde.png");
		tilde4.scale.set(0,0);
		add(tilde4);
		
		cruz1 = new FlxSprite(opcionAzul.x,opcionAzul.y);
		cruz1.loadGraphic("assets/images/cruz.png");
		cruz1.scale.set(0,0);
		add(cruz1);
		
		cruz2 = new FlxSprite(opcionRojo.x,opcionRojo.y);
		cruz2.loadGraphic("assets/images/cruz.png");
		cruz2.scale.set(0,0);
		add(cruz2);
		
		cruz3 = new FlxSprite(opcionVerde.x,opcionVerde.y);
		cruz3.loadGraphic("assets/images/cruz.png");
		cruz3.scale.set(0,0);
		add(cruz3);
		
		cruz4 = new FlxSprite(opcionAmarillo.x,opcionAmarillo.y);
		cruz4.loadGraphic("assets/images/cruz.png");
		cruz4.scale.set(0,0);
		add(cruz4);
		
		player1 = new PlayerInput("W", "S", "A", "D",Reg.gamepad1);
		add(player1);
		player2 = new PlayerInput("T","G","F","H",Reg.gamepad2);
		add(player2);
		player3 = new PlayerInput("I","K","J","L",Reg.gamepad3);
		add(player3);
		player4 = new PlayerInput("UP","DOWN","LEFT","RIGHT",Reg.gamepad4);
		add(player4);
		estado = "esperando";
		fadeTime = 4;
		
		resultBg = new FlxSprite(0, 0);
		resultBg.makeGraphic(600, 200, FlxColor.BEIGE);
		resultBg.x = FlxG.width / 2 - resultBg.width / 2;		
		resultBg.y = FlxG.height / 2 - resultBg.height / 2 - 50;
		add(resultBg);
		resultBg.y -= 600;
		
		result1 = new FlxText(0, 0, 300, "AZUL: ", 30);
		result1.setFormat(null, 30, FlxColor.BLUE, "center", FlxText.BORDER_OUTLINE);
		result1.font = "font";
		result1.x = resultBg.x;
		result1.y = resultBg.y + 75 - result1.height;
		add(result1);
		
		result2 = new FlxText(0, 0, 300, "ROJO: ", 30);
		result2.setFormat(null, 30, FlxColor.RED, "center", FlxText.BORDER_OUTLINE);
		result2.font = "font";
		result2.x = resultBg.x + 300;
		result2.y = resultBg.y + 75 - result2.height;
		add(result2);
		
		result3 = new FlxText(0, 0, 300, "VERDE: ", 30);
		result3.setFormat(null, 30, FlxColor.GREEN, "center", FlxText.BORDER_OUTLINE);
		result3.font = "font";
		result3.x = resultBg.x;
		result3.y = resultBg.y + 175 - result3.height;
		add(result3);
		
		result4 = new FlxText(0, 0, 300, "AMARILLO: ", 30);
		result4.setFormat(null, 30, FlxColor.YELLOW, "center", FlxText.BORDER_OUTLINE);
		result4.font = "font";
		result4.x = resultBg.x + 300;
		result4.y = resultBg.y + 175 - result4.height;
		add(result4);
		
		scoreTime = 2;
		score = 10;
		score1 = score;
		score2 = score;
		score3 = score;
		score4 = score;
		
		answer = 1;
		var cnx = sys.db.Sqlite.open("assets/TestDB.sqlite");
		var count:Int;
		var rset = cnx.request("SELECT * FROM Preguntas");
		count = FlxRandom.intRanged(1, rset.length);
		while (Reg.preguntas[count])
		{
			count++;
			if (count == 100)
				count = 0;
		}
		Reg.preguntas[count] = true;
		var rset = cnx.request("SELECT * FROM Preguntas WHERE ID = " + Std.string(count));
		for ( row in rset ) {
			_pregunta.resetText(row.Pregunta);
			pregLength = row.Pregunta.length;
			_pregunta.start();
			_respuesta1.text = row.opcion1;
			_respuesta2.text = row.opcion2;
			_respuesta3.text = row.opcion3;
			_respuesta4.text = row.opcion4;
			answer = row.respuesta;
		}
		cnx.close();
		time = 0.2;
	}
	
	private function mostrarRespuestas():Void
	{
		_respuesta1.visible = true;
		_respuesta2.visible = true;
		_respuesta3.visible = true;
		_respuesta4.visible = true;
	}
	/**
	 * Function that is called when this state is destroyed - you might want to 
	 * consider setting all objects this state uses to null to help garbage collection.
	 */
	override public function destroy():Void
	{
		super.destroy();
	}
	
	override function update():Void
	{
		super.update();	
		time -= FlxG.elapsed;
		if (time < 0)
		{
			time = 0.2;	
			if (player1.getInput() == -1)
				textoAzul.text += ".";
			else
				textoAzul.text = "?";
				
			if (player2.getInput() == -1)
				textoRojo.text += ".";
			else
				textoRojo.text = "?";
				
			if (player3.getInput() == -1)
				textoVerde.text += ".";
			else
				textoVerde.text = "?";
				
			if (player4.getInput() == -1)
				textoAmarillo.text += ".";
			else
				textoAmarillo.text = "?";
		}
		if (textoAzul.text == "....")
			textoAzul.text = "";
		if (textoRojo.text == "....")
			textoRojo.text = "";
		if (textoVerde.text == "....")
			textoVerde.text = "";
		if (textoAmarillo.text == "....")
			textoAmarillo.text = "";		
		switch(estado)
		{
			case "esperando":
				_reloj -= FlxG.elapsed;
				_relojTexto.text = Std.string(Std.int(_reloj));
				if (_reloj < 1 || (player1.getInput() != -1 && player2.getInput() != -1 && player3.getInput() != -1 && player4.getInput() != -1))
				{
					_pregunta.start(0);
					estado = "mostrando";
					if (_reloj > 1)
					{
						channel.stop();
						channel = sound.play(30000);
					}
					textoAzul.visible = false;
					textoRojo.visible = false;
					textoVerde.visible = false;
					textoAmarillo.visible = false;
				}
			case "mostrando":
				if (player1.getInput() == answer)
				{
					var tween = FlxTween.tween(tilde1.scale,{x:1,y:1},1,{ease:FlxEase.bounceOut});
					Reg.scoreAdd1 = score1 * Reg.multiplier1;
				}
				else
					var tween = FlxTween.tween(cruz1.scale, { x:1, y:1 }, 1, { ease:FlxEase.bounceOut } );
				if (player2.getInput() == answer)
				{
					var tween = FlxTween.tween(tilde2.scale,{x:1,y:1},1,{ease:FlxEase.bounceOut});
					Reg.scoreAdd2 = score2 * Reg.multiplier2;
				}
				else
					var tween = FlxTween.tween(cruz2.scale,{x:1,y:1},1,{ease:FlxEase.bounceOut});
				if (player3.getInput() == answer)
				{
					var tween = FlxTween.tween(tilde3.scale,{x:1,y:1},1,{ease:FlxEase.bounceOut});
					Reg.scoreAdd3 = score3 * Reg.multiplier3;
				}
				else
					var tween = FlxTween.tween(cruz3.scale,{x:1,y:1},1,{ease:FlxEase.bounceOut});
				if (player4.getInput() == answer)
				{
					var tween = FlxTween.tween(tilde4.scale,{x:1,y:1},1,{ease:FlxEase.bounceOut});
					Reg.scoreAdd4 = score4 * Reg.multiplier4;
				}
				else
					var tween = FlxTween.tween(cruz4.scale, { x:1, y:1 }, 1, { ease:FlxEase.bounceOut } );
					
				result1.text += Std.string(Reg.scoreAdd1);
				result2.text += Std.string(Reg.scoreAdd2);
				result3.text += Std.string(Reg.scoreAdd3);
				result4.text += Std.string(Reg.scoreAdd4);
				if (answer == 1)
				{
					var tween = FlxTween.tween(_respuesta1.scale,{x:1.5,y:1.5},0.5,{type:FlxTween.PINGPONG});
					var tween = FlxTween.tween(_imagenRespuesta1.scale, { x:1.5, y:1.5 }, 0.5, { type:FlxTween.PINGPONG } );
				}
				else if (answer == 2)
				{
					var tween = FlxTween.tween(_respuesta2.scale,{x:1.5,y:1.5},0.5,{type:FlxTween.PINGPONG});
					var tween = FlxTween.tween(_imagenRespuesta2.scale, { x:1.5, y:1.5 }, 0.5, { type:FlxTween.PINGPONG } );
				}
				else if (answer == 3)
				{
					var tween = FlxTween.tween(_respuesta3.scale,{x:1.5,y:1.5},0.5,{type:FlxTween.PINGPONG});
					var tween = FlxTween.tween(_imagenRespuesta3.scale, { x:1.5, y:1.5 }, 0.5, { type:FlxTween.PINGPONG } );
				}
				else if (answer == 4)
				{
					var tween = FlxTween.tween(_respuesta4.scale,{x:1.5,y:1.5},0.5,{type:FlxTween.PINGPONG});
					var tween = FlxTween.tween(_imagenRespuesta4.scale, { x:1.5, y:1.5 }, 0.5, { type:FlxTween.PINGPONG } );
				}
				estado = "score";
				
			case "score":
				scoreTime -= FlxG.elapsed;
				if (scoreTime <= 0)
				{
					var tween = FlxTween.tween(result1, { y:result1.y+600 }, 1, { ease:FlxEase.bounceOut } );
					var tween = FlxTween.tween(result2, { y:result2.y+600 }, 1, { ease:FlxEase.bounceOut } );
					var tween = FlxTween.tween(result3, { y:result3.y+600 }, 1, { ease:FlxEase.bounceOut } );
					var tween = FlxTween.tween(result4, { y:result4.y+600 }, 1, { ease:FlxEase.bounceOut } );
					var tween = FlxTween.tween(resultBg, { y:resultBg.y+600 }, 1, { ease:FlxEase.bounceOut , complete:termino } );
					estado = "nada";		
				}
				
			case "fading":
				fadeTime -= FlxG.elapsed;
				if (fadeTime <= 0)
				{
					FlxG.camera.fade(FlxColor.BLACK,1,false,fade);
					estado = "nada";
				}
		}

	}
	
	private function fade():Void
	{
		Reg.rondas--;
		var cnx = sys.db.Sqlite.open("assets/TestDB.sqlite");
		var rset = cnx.request("DELETE FROM Partidas");
		try 
		{
			cnx.request("INSERT INTO Partidas (score1,score2,score3,score4,carcel1,carcel2,carcel3,carcel4,multiplier1,multiplier2,multiplier3,multiplier4,posicion1,posicion2,posicion3,posicion4,rondas) VALUES (" +
			Reg.score1 + "," +  Reg.score2 + "," + Reg.score3 + "," + Reg.score4 + "," +
			Reg.carcel1 + "," + Reg.carcel2 + "," + Reg.carcel3 + "," + Reg.carcel4 + "," +
			Reg.multiplier1 + "," + Reg.multiplier2 + "," + Reg.multiplier3 + "," + Reg.multiplier4 + "," +
			Reg.position1 + "," + Reg.position2 + "," + Reg.position3 + "," + Reg.position4 + "," + Reg.rondas + ")");
		} 
		catch( msg : String ) {
			trace("Error occurred: " + msg);
		}
		
		var rset = cnx.request("DELETE FROM ScoreAdd");
		try 
		{
			cnx.request("INSERT INTO ScoreAdd (add1,add2,add3,add4) VALUES (" +
			Reg.scoreAdd1 + "," +  Reg.scoreAdd2 + "," + Reg.scoreAdd3 + "," + Reg.scoreAdd4 + ")");
		} 
		catch( msg : String ) {
			trace("Error occurred: " + msg);
		}
		cnx.close();
		if (Reg.rondas == -1)
			FlxG.switchState(new VictoryState());
		else
			FlxG.switchState(new TableroTestState());
	}
	
	private function termino(tween:FlxTween):Void
	{
		estado = "fading";
	}

}